
#include "ImageTGA.h"
#include "Texture.h"
#include <GL/glew.h>
#include <GL/glu.h>
#include <iostream>
#include <stdio.h>

Texture::Texture(const char * arg_file)
{
	/*
	 * 	On utilise la méthode glGenTextures pour générer x textures utilisable par openGL
	 * 	le premier paramètre correspond au nombre de texture que l'on souhaite générer
	 * 	le deuxieme paramètre permet de récupérer l'indice de la texture dans le buffer OpenGL (tableau)
	 */
	 
    glGenTextures(1, &textureIndex);

	/*
	 * 	Charge l'image au format tga
	 */
	 
    image = ImageTGA::LoadTgaImage((char *)arg_file, &width, &height, &bitPerPixel);

	/*
	 * 	Si l'image a bien été chargée
	 */
	 
	
	
    if(image!=NULL)
    {
		printf("Image Loaded \n");
		/*
		 * 	La méthode glBindTexture permet de sélectionner une texture à partir de son identifiant
		 * 	Toutes les méthodes affectant le comportement ou le contenu d'une texture modifieront la dernière ayant été 
		 * 	appelé par la méthode glBindTexture()
		 */
		 
        glBindTexture(GL_TEXTURE_2D, textureIndex);
        
        if(bitPerPixel==32)		
		{
			/*
			 * 	La méthode glTexImage2D permet de spécifier une image (représenté par un tableau de unsigned char), à la 
			 *  texture courante
			 */
			 
			glTexImage2D(
							 GL_TEXTURE_2D, 0, 4,
							 width, height,
							 0, GL_RGBA, GL_UNSIGNED_BYTE, image
							);
		}
        else
		{
			glTexImage2D(
							 GL_TEXTURE_2D, 0, 3,
							 width, height,
							 0, GL_RGB, GL_UNSIGNED_BYTE, image
					 );
		}


        //delete[] img;

        Define_bouclage();
        Define_filtrage();
    }
    
}


void Texture::Define_bouclage()
{
        glTexParameteri(	GL_TEXTURE_2D,
                                                GL_TEXTURE_MIN_FILTER,
                                                GL_LINEAR);

        glTexParameteri(
                                                GL_TEXTURE_2D,
                                                GL_TEXTURE_MAG_FILTER,
                                                GL_LINEAR);
}

void Texture::Define_filtrage()
{
        glTexParameteri(	GL_TEXTURE_2D,
                                                GL_TEXTURE_WRAP_S,
                                                GL_REPEAT
                                        );

        glTexParameteri(
                                                GL_TEXTURE_2D,
                                                GL_TEXTURE_WRAP_T,
                                                GL_REPEAT
                                        );
        glTexEnvf	(
                                        GL_TEXTURE_ENV,
                                        GL_TEXTURE_ENV_MODE,
                                        GL_MODULATE
                                );
}

GLuint Texture::Get_index()
{
        return textureIndex;
}

void Texture::Use()
{
	glBindTexture(GL_TEXTURE_2D, textureIndex);
}
